package com.test23_正则表达式;

import org.junit.Test;

public class Demo02_Matches {

    /**
     * 单个字符匹配
     * x    表示一位任意的字符
     * \\   匹配符号'\'
     * \t   匹配制表符
     * \n   匹配换行
     */
    @Test
    public void test1() {
        {
            String str = "y";
            System.out.println(str.matches("y"));
        }
        {
            String str = "\\";
            System.out.println(str.matches("\\\\"));
        }
        {
            String str = "\t";
            System.out.println(str.matches("\t"));
        }
        {
            String str = "\n";
            System.out.println(str.matches("\n"));
        }
    }

    /**
     * 字符范围
     * [abc]    匹配a、b、c中任意一位
     * [^abc]   求反，不是abc中的任意一位
     * [a-zA-Z] 匹配所有的字母(大小写)，[a-z]匹配所有小写字母，[A-Z]匹配所有大写字母
     * [0-9]    匹配所有的数字
     */
    @Test
    public void test2() {
        {
            String str = "y";
            System.out.println(str.matches("[xyz]"));
        }
        {
            String str = "a";
            System.out.println(str.matches("[^xyz]"));
        }
        {
            String str = "M";
            System.out.println(str.matches("[a-zA-Z]"));
        }
        {
            String str = "1";
            System.out.println(str.matches("[0-9]"));
        }
    }

    /**
     * 简化表达式(只表示1位)
     * .    表示任意的字母
     * \d   匹配任意的1位数字
     * \D   匹配任意的1位非数字
     * \s   匹配任意的空格，等价于[ \t\n\x0B\f\r]
     * \S   匹配任意的非空格，等价于[^\s]
     * \w   匹配字母、数字、下划线，等价于[a-zA-Z_0-9]
     * \W   匹配非字母、数字、下划线，等价于[^\w]
     */
    @Test
    public void test3() {
        {
            String str = "$";
            System.out.println(str.matches("."));
        }
        {
            String str = "2";
            System.out.println(str.matches("\\d"));
        }
        {
            String str = "\n";
            System.out.println(str.matches("\\s"));
        }
        {
            String str = "W";
            System.out.println(str.matches("\\w"));
        }
    }

    /**
     * 边界匹配
     * ^    匹配开始位置
     * $    匹配结束位置
     */
    @Test
    public void test4() {
        {
            String str = "_";
            System.out.println(str.matches("^\\w$"));
        }
    }

    /**
     * 数量表达式
     * ?        表示出现0次或1次
     * *        表示出现0次、1次或多次
     * +        表示出现1次或多次
     * {n}      表示出现n次
     * {n,}     表示出现n次以上
     * {n,m}    表示出现n~m次
     */
    @Test
    public void test5() {
        {
            String str = "";
            System.out.println(str.matches("\\w?"));
        }
        {
            String str = "";
            System.out.println(str.matches("\\w*"));
        }
        {
            String str = "";
            System.out.println(str.matches("\\w+"));
        }
        {
            String str = "yootk";
            System.out.println(str.matches("\\w{5}"));
        }
        {
            String str = "yootk_com";
            System.out.println(str.matches("\\w{5,}"));
        }
    }

    /**
     * 逻辑运算
     * 正则A正则B      正则A紧跟正则B
     * 正则A|正则B     或运算
     * (正则)         将正则表达式作为一组
     */
    @Test
    public void test6() {
        {
            String str = "yootk.com";
            System.out.println(str.matches("yootk.+"));
        }
        {
            String str = "yootk.com";
            System.out.println(str.matches("yootk|\\w+"));
        }
        {
            String str = "yootk.com";
            System.out.println(str.matches("(\\w)*"));
        }
    }
}
